package com.sxran.im.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.Lists;
import com.sxran.im.bean.AcceptFriendApplicationHttpResp;
import com.sxran.im.bean.ImException;
import com.sxran.im.bean.NotificationBody;
import com.sxran.im.dao.ImFriendInviteMapper;
import com.sxran.im.dao.ImFriendMapper;
import com.sxran.im.dao.ImUserMapper;
import com.sxran.im.feign.ImApiFeign;
import com.sxran.im.feign.dto.*;
import com.sxran.im.handler.*;
import com.sxran.im.info.*;
import com.sxran.im.sbean.CloseNotificationRequest;
import com.sxran.im.sbean.LoginInputBean;
import com.sxran.im.sbean.LoginOutputBean;
import com.sxran.im.sbean.UserBindGroupInputBean;
import com.sxran.im.service.FriendInviteService;
import com.sxran.im.service.JWTService;
import com.sxran.im.service.UserGroupService;
import com.sxran.im.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 */
@CrossOrigin(origins = "*")
@RestController
public class FriendController {
	@Resource
	private ImApiFeign imApiFeign;
	@Resource
	private ImFriendMapper imFriendMapper;
	@Resource
	private UserService userService;

	@Resource
	private ImFriendInviteMapper imFriendInviteMapper;
	@Resource
	private ImUserMapper imUserMapper;
	@Resource
	private FriendInviteService friendInviteService;

	///////////////////////////////////////////////////////////
	////                      带有通知的接口
	////
	////////////////////////////////////////////////////////////

	/**
	 * 拒绝
	 * @see RefuseFriendApplicationCmdHandler
	 * @param json
	 * @return
	 */
	@PostMapping("/api/friend/refuse")
	public CommonResult<Boolean> refuse(@RequestBody ImFriendInvite json){
		// 修改申请,通知的状态。
		json.setState(-100);
		friendInviteService.updateState(json);
		// 单独提示当前用户拒绝进入群聊的信息.
		RefuseFriendDTO refuseFriendDTO = new RefuseFriendDTO();
		refuseFriendDTO.setToUid(json.getToUid());
		refuseFriendDTO.setContent(json.getMessage()); // 拒绝的信息.
		imApiFeign.chatUser(json.getFromUid(),refuseFriendDTO);
		return CommonResult.success(true);
	}
	/**
	 * 同意
	 * @see AcceptFriendApplicationCmdHandler
	 * @param json
	 * @return
	 */
	@PostMapping("/api/friend/accept")
	public CommonResult<Boolean> accept(@RequestBody ImFriendInvite json){
// 修改申请,通知的状态。
		json.setState(100);
		friendInviteService.updateState(json);
		// 设置最新的用户信息。
		String fromUid = json.getFromUid();
		String curUserId =  json.getToUid();  // ImController.getCurUserId();
		ImUser imUser = userService.selectByUserId(fromUid);
		// 自己表添加一条记录
		ImFriend friend = new ImFriend();
		friend.setUserId(curUserId);
		friend.setFriendUid(fromUid);
		friend.setCreatTime(new Date());
		imFriendMapper.insert(friend);
		// 对方也添加一条记录。
		friend.setFriendUid(curUserId);
		friend.setUserId(fromUid);
		imFriendMapper.insert(friend);
		// 通知对方
		// 单独提示当前用户拒绝进入群聊的信息.
		AcceptFriendDTO acceptFriendDTO = new AcceptFriendDTO();
		acceptFriendDTO.setToUid(curUserId);
		acceptFriendDTO.setSysMeg("我们已经是好友啦");
		acceptFriendDTO.setHelloMeg("你好,很高兴遇见你");
		imApiFeign.chatUser(fromUid,acceptFriendDTO);
		return CommonResult.success(true);
	}

	/**
	 * 申请好友
	 * @see AddFriendInviteCmdHandler
	 * @param bean
	 * @return
	 */
	@PostMapping("/api/friend/apply")
	public CommonResult<Boolean> apply(@RequestBody ImFriendInvite bean ){
		String curUserId = bean.getFromUid();
		String toUid = bean.getToUid();
		//
		if (StrUtil.equals(curUserId,toUid)) {
			return CommonResult.error(10025,"不能加自己为好友");
		}
		if (imUserMapper.selectById(toUid) == null) {
			return CommonResult.error(10025,"对应用户不存在");
		}
		//
		LambdaQueryWrapper<ImFriend> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(ImFriend::getFriendUid,toUid);
		queryWrapper.eq(ImFriend::getUserId,curUserId);
		if (imFriendMapper.exists(queryWrapper)) {
			return CommonResult.error(10025,"已经是好友");
		}
		// TODO 检查是不是黑名单...

		// 不存在就添加，存在就更新
		bean.setFromUid(curUserId);
		ImFriendInvite imFriendInvite = friendInviteService.updateOrInsert(bean);
		// 通知

		// 单独提示当前用户拒绝进入群聊的信息.
		FriendInviteDTO friendInviteDTO = new FriendInviteDTO();
		friendInviteDTO.setFromUid(curUserId);
		friendInviteDTO.setMessage(bean.getMessage());
		imApiFeign.chatUser(toUid,friendInviteDTO);

		return CommonResult.success(true);
	}



	///////////////////////////////////////////////////////////
	////		传统的im业务...
	////
	////////////////////////////////////////////////////////////
	/**
	 * 删除好友..
	 * @see DeleteFriendCmdHandler
	 * @param userId
	 * @return
	 */
	@PostMapping("/api/friend/delete")
	public CommonResult<Integer> delete(@RequestParam("userId") String userId ,@RequestParam("friendUid") String  friendUid){
		ImFriend json = new ImFriend();
		json.setUserId(userId);
		json.setFriendUid(friendUid);
		LambdaQueryWrapper<ImFriend> queryWrapper = new LambdaQueryWrapper<>(json);
		// 删除对应的会话内容。
		int delete = imFriendMapper.delete(queryWrapper);
		return  CommonResult.success(delete);
	}
	/**
	 * @see GetFriendListCmdHandler
	 * @param userId
	 * @return
	 */
	@PostMapping("/api/friend/myFriend")
	public CommonResult<List<ImUser>> myFriend(@RequestParam("userId") String userId){
		// 查询当前用户拥有的用户列表。
		LambdaQueryWrapper<ImFriend> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(ImFriend::getUserId , userId);
		List<ImFriend> imFriends = imFriendMapper.selectList(queryWrapper);
		// 用户详情。
		List<ImUser> users = imFriends.stream().map(x -> userService.selectByUserId(x.getFriendUid()) ).collect(Collectors.toList());
		return  CommonResult.success(users);
	}

}
